home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / tex / td187src.lzh / METAFONT.I < prev    next >
Text File  |  1991-12-14  |  32KB  |  929 lines

  1. IMPLEMENTATION MODULE Metafont ;
  2.  
  3. (* 23/01/91 21:17 *)
  4. (* 29/01/91 23:55 *)
  5. (* 06/02/91 09:15 *)
  6. FROM BezierCurve IMPORT ComputeBezier;
  7. FROM Dialoge     IMPORT BusyStart, BusyEnd;
  8. FROM FileIO      IMPORT WriteLn, Rewrite, Close;
  9. FROM SYSTEM      IMPORT ADDRESS , ADR ;
  10. FROM Types       IMPORT ObjectSet, TextPosTyp, DrawObjectTyp, ObjectPtrTyp;
  11. IMPORT CommonData ;
  12. IMPORT Diverses ;
  13. IMPORT GetFile ;
  14. IMPORT MathLib0;
  15. IMPORT ObjectUtilities ;
  16. IMPORT MagicStrings ;
  17. IMPORT MagicSys ;
  18. IMPORT Variablen ;
  19.  
  20. (**
  21. IMPORT PDebug;
  22. **)
  23. (* Index 1 und 2 bezeichen immer den Referenzpunkt                         *)
  24. (* Index 8 zumeist die Liniendicke, Index 9 die Textlänge so vorhanden     *)
  25. (*      0         |   3    |   4   |   5   |   6   |   7   |   8   |   9   *)
  26. (* ---------------+--------+-------+---------------+-------+-------+------ *)
  27. (* Picture        | XExt   | YExt  |objekte|unitlen|       |       |       *)
  28. (* Text           |        |       |       |       |AlignFl|       |Textlen*)
  29. (* Line           |        |       |       |       |       |       |       *)
  30. (* Arrow          |        |       |       |       |       |       |       *)
  31. (* Circle         | Radius |       |       |       |       |       |       *)
  32. (* Disk           | Radius |       |       |       |       |       |       *)
  33. (* Oval           | Radius | Posit.|       |       |       |       |       *)
  34. (* Filledbox      | XExt   | XExt  |       |       |       |       |       *)
  35. (* Ovalbox        | XExt   | YExt  |       |       |       |       |       *)
  36. (* Framebox       | XExt   | YExt  |Textpos|MBxFlag|AlignFl|       |Textlen*)
  37. (* Dashbox        | XExt   | Yext  |Textpos|       |AlignFl|       |Textlen*)
  38. (* Beziercurve    |  X2    |  Y2   |  X3   |  Y3   |Points |       |       *)
  39. (* Bezierellipse  |  X2    |  Y2   |  X3   |  Y3   |Points |       |       *)
  40. (* EpicSolidLine  | Pts-1  |       |       |       |       |       |MarkTL *)
  41. (* EpicDottedLine | Pts-1  |       |       |       |       |       |   "   *)
  42. (* EpicDashedLine | Pts-1  |       |       |       |       |       |   "   *)
  43. (* EpicGrid       | Xext   | YExt  |DeltaX |DeltaY |       |       |       *)
  44.  
  45. CONST NUL  =  0C ;
  46.       LF   = 12C ;
  47.       CR   = 15C ;
  48.       CNTR = 0;
  49.       LEFT = 1;
  50.       RGHT = 2;
  51.       TOP  = 1;
  52.       BOT  = 2;
  53.       BASE = 3;
  54.  
  55.  
  56. VAR OutLine, Part,
  57.     String         : ARRAY [0..255] OF CHAR ;
  58.     converted      : ARRAY [0..9] OF CHAR;
  59.     Comment        : ARRAY [0..1] OF CHAR;
  60.     Handle , i , j : INTEGER ;
  61.     Bool           : BOOLEAN ;
  62.     LatexObs       : BOOLEAN;
  63.     Object         : ObjectPtrTyp ;
  64.     Width          : INTEGER ;  (* Liniendicke *)
  65.     maxX, maxY,
  66.     minX, minY     : INTEGER;
  67.     prefaktor      : INTEGER;
  68.  
  69. (**********************************************************)
  70. (**
  71. PROCEDURE AppendChar(c : CHAR; VAR target : ARRAY OF CHAR);
  72. VAR temp : ARRAY [0..1] OF CHAR;
  73. BEGIN
  74.   temp[0] := c;
  75.   temp[1] := 0C;
  76.   MagicStrings.Append(temp, target);
  77. END AppendChar;
  78. **)
  79. (**********************************************************)
  80.  
  81. PROCEDURE GetNumber(num : INTEGER; VAR str : ARRAY OF CHAR);
  82. VAR len, i  : INTEGER;
  83.     nul, pt : ARRAY [0..1] OF CHAR;
  84. BEGIN
  85.   nul := '0';
  86.   pt  := '.';
  87.   Variablen.NumberToStr(num, str);
  88.   IF prefaktor >0 THEN
  89.     len := MagicStrings.Length(str);
  90.     WHILE (prefaktor>len) DO
  91.       MagicStrings.Insert(nul, str, 0);
  92.       len := MagicStrings.Length(str);
  93.     END;
  94.     MagicStrings.Insert(pt, str, len - prefaktor);
  95.   END;
  96. END GetNumber;
  97.  
  98. (**********************************************************)
  99.  
  100. PROCEDURE WriteMetaProlog(charcode : INTEGER);
  101. VAR unitstr : ARRAY [0..9] OF CHAR;
  102.     i       : INTEGER;
  103. BEGIN
  104.   WriteLn ( Handle, Comment ) ;
  105.   OutLine := "% "; MagicStrings.Append ( String , OutLine ); WriteLn( Handle, OutLine ) ;
  106.   WriteLn ( Handle, '% Graphic-font-file  (created by TeX-Draw, JP-91)');
  107.   WriteLn ( Handle, Comment ) ;
  108.   WriteLn ( Handle, 'mode_setup;');
  109.   WriteLn ( Handle, 'font_identifier:="TeXDraw-Picture";');
  110.   WriteLn ( Handle, 'font_coding_scheme:="TeXDraw-Conversion";');
  111.  
  112.   OutLine := 'unit#:=';
  113.   IF prefaktor>0 THEN
  114. (*    AppendChar('1', OutLine);*)
  115.     MagicStrings.Append('1', OutLine);
  116.     FOR i:=1 TO prefaktor DO
  117. (*      AppendChar('0', OutLine);*)
  118.       MagicStrings.Append('0', OutLine);
  119.     END;
  120. (*    AppendChar('*', OutLine);*)
  121.     MagicStrings.Append('*', OutLine);
  122.   END;
  123.   Variablen.FactorToStr(converted);
  124.   MagicStrings.Append(converted, OutLine);
  125.   MagicStrings.Append(' * ', OutLine);
  126.   Variablen.UnitToStr(unitstr);
  127.   MagicStrings.Append(unitstr, OutLine);
  128.   MagicStrings.Append('#;', OutLine);
  129.   WriteLn(Handle, OutLine);
  130.   OutLine := 'u#:=1/';
  131.   Variablen.NumberToStr(CommonData.InternalResolution, converted);
  132.   MagicStrings.Append( converted, OutLine);
  133.   MagicStrings.Append( '* unit#;  % basic units', OutLine); WriteLn(Handle, OutLine);
  134.  
  135.   OutLine := 'font_size ';
  136.   GetNumber(maxY - minY, converted);
  137.   MagicStrings.Append(converted, OutLine);
  138.   MagicStrings.Append(' * u#;', OutLine);
  139.   WriteLn(Handle, OutLine);
  140.   WriteLn ( Handle, Comment);
  141.  
  142.   WriteLn ( Handle, "% This file contains just one graphic, so we don't need to");
  143.   WriteLn ( Handle, "% specify values for fontdimen 1..7 (at least I hope so).");
  144.  
  145.   WriteLn ( Handle, Comment);
  146.  
  147.   OutLine := 'symb_w#    :=';
  148.   GetNumber(maxX-minX, converted);
  149.   MagicStrings.Append( converted, OutLine);
  150.   MagicStrings.Append( ' * u#;', OutLine);
  151.   WriteLn(Handle, OutLine);
  152.  
  153.   OutLine := 'symb_h#    :=';
  154.   GetNumber(maxY-minY, converted);
  155.   MagicStrings.Append( converted, OutLine);
  156.   MagicStrings.Append( ' * u#;', OutLine);
  157.   WriteLn(Handle, OutLine);
  158.  
  159.   OutLine := 'thin_pen#  := ';
  160.   i := (CommonData.MetaLThin MOD 10000) DIV 1000;
  161.   Variablen.NumberToStr(i, converted);
  162.   MagicStrings.Append( converted, OutLine);
  163. (*  AppendChar('.', OutLine);*)
  164.   MagicStrings.Append('.', OutLine);
  165.   i := CommonData.MetaLThin MOD 1000;
  166.   Variablen.NumberToStr(i, converted);
  167.   MagicStrings.Append( converted, OutLine);
  168.   IF CommonData.MetaLThin DIV 10000 > 0 THEN (* mm *)
  169.     MagicStrings.Append( 'mm', OutLine);
  170.    ELSE
  171.     MagicStrings.Append( 'pt', OutLine);
  172.   END;
  173.   MagicStrings.Append( '#; define_blacker_pixels(thin_pen);', OutLine);
  174.   WriteLn ( Handle, OutLine);
  175.   OutLine := 'thick_pen# := ';
  176.   i := (CommonData.MetaLThick MOD 10000) DIV 1000;
  177.   Variablen.NumberToStr(i, converted);
  178.   MagicStrings.Append( converted, OutLine);
  179. (*  AppendChar('.', OutLine);*)
  180.   MagicStrings.Append('.', OutLine);
  181.   i := CommonData.MetaLThick MOD 1000;
  182.   Variablen.NumberToStr(i, converted);
  183.   MagicStrings.Append( converted, OutLine);
  184.   IF CommonData.MetaLThin DIV 10000 > 0 THEN (* mm *)
  185.     MagicStrings.Append( 'mm', OutLine);
  186.    ELSE
  187.     MagicStrings.Append( 'pt', OutLine);
  188.   END;
  189.   MagicStrings.Append( '#; define_blacker_pixels(thick_pen);', OutLine);
  190.   WriteLn ( Handle, OutLine);
  191.   OutLine := 'vthick_pen#  := ';
  192.   i := (CommonData.MetaLVThick MOD 10000) DIV 1000;
  193.   Variablen.NumberToStr(i, converted);
  194.   MagicStrings.Append( converted, OutLine);
  195. (*  AppendChar('.', OutLine);*)
  196.   MagicStrings.Append('.', OutLine);
  197.   i := CommonData.MetaLVThick MOD 1000;
  198.   Variablen.NumberToStr(i, converted);
  199.   MagicStrings.Append( converted, OutLine);
  200.   IF CommonData.MetaLVThick DIV 10000 > 0 THEN (* mm *)
  201.     MagicStrings.Append( 'mm', OutLine);
  202.    ELSE
  203.     MagicStrings.Append( 'pt', OutLine);
  204.   END;
  205.   MagicStrings.Append( '#; define_blacker_pixels(vthick_pen);', OutLine);
  206.   WriteLn ( Handle, OutLine);
  207.   WriteLn ( Handle, 'pickup pencircle scaled vthick_pen; vthick_nib := savepen;');
  208.   WriteLn ( Handle, 'pickup pencircle scaled thick_pen; thick_nib := savepen;');
  209.   WriteLn ( Handle, 'pickup pencircle scaled thin_pen; thin_nib := savepen;');
  210.   WriteLn ( Handle, Comment);
  211.  
  212.   WriteLn ( Handle, 'define_pixels(unit, u);');
  213.   WriteLn ( Handle, Comment);
  214.  
  215.   IF ObjectUtilities.ObjectExist(
  216.        ObjectSet{
  217.          EpicDottedLine,
  218.          EpicDashedLine,
  219.          Dashbox,
  220.          Arrow}) THEN
  221.     WriteLn ( Handle, "input linmacro;